/******************************************************
 * Copyright (c) 2012, LIJUN All rights reserved *
 ******************************************************/
 
/*!
 * Includes Sizzle.js
 * http://sizzlejs.com/
 * Copyright 2011, The Dojo Foundation
 * Released under the MIT, BSD, and GPL Licenses.
 */
 
/**
 * Node接口
 * @author carlli
 * @encode utf-8
 * @version 1.0
 * @data 2012.9.24
 * @modify
 * -------------------------------------------------------------------
 * 
 * -------------------------------------------------------------------
 * @usage
 * -------------------------------------------------------------------
 *
 * -------------------------------------------------------------------
 */
Smart.define("node", function(S){
    
    var __node = {
        /**
         * HTML编码
         * @param String str 需要编码的HTML代码
         * @return String str 编码后的HTML代码
         */
        encodeHTML : function(str){
            str = str.replace(/</gm, "&lt;");
            str = str.replace(/>/gm, "&lt;");
            
            return str;
        },
        /**
         * HTML解码
         * @param String str 需要解码的HTML代码
         * @return String str 解码后的HTML代码
         */
        decodeHTML : function(str){
            str = str.replace(/&lt;/gm, "<");
            str = str.replace(/&lt;/gm, ">");
            
            return str;
        },
        /**
         * 获取节点
         * @param Node|String selector 节点/CSS选择器
         * @return Node node 节点
         */
        one : function(selector){
            if(typeof(selector) == "string"){
                var o = Sizzle(selector);
                var node = (o.length > 0 ? o[0] : null);
                return node;
            }else{
                return (selector || null);
            }
        },
        /**
         * 获取节点列表
         * @param Node|String selector 节点/CSS选择器
         * @return NodeList nodeList 列表
         */
        all : function(selector){
            if(typeof(selector) == "string"){
                var o = Sizzle(selector);
                var nodeList = (o.length > 0 ? o : []);
                return nodeList;
            }else{
                return (selector || []);
            }
        },
        /**
         * 设置/获取指定节点的html代码
         * @param Node|String selector 节点/CSS选择器
         * @param String str HTML代码，如果不传将返回节点的innerHTML
         * @return String html str参数为undefined或不传时返回
         */
        html : function(selector, str){
            var n = this.one(selector);
            
            if(null != n){
                if(undefined === str){
                    return n.innerHTML;
                }else{
                    n.innerHTML = this.encodeHTML(str);
                }
            }
        },
        /**
         * 设置/获取指定的属性
         * @param Node|String selector 节点/CSS选择器
         * @param String name 属性名称
         * @param String value 属性值
         * @return String attr value参数为undefined或不传时返回
         */
        attr : function(selector, name, value){
            var n = this.one(selector);
            
            if(null != n){
                if(undefined === value){
                    return n[name];
                }else{
                    n[name] = value;
                }
            }
        },
        /**
         * 添加子节点
         * @param Node|String pSelector 父节点/父节点CSS选择器
         * @param Node cNode 子节点
         * @return Node n 新的子节点
         */
        append : function(pSelector, cNode){
            var p = this.one(pSelector);
            
            if(null != p){
                return p.appendChild(cNode);
            }
            return null;
        },
        /**
         * 删除子节点
         * @param Node|String pSelector 父节点/父节点CSS选择器
         * @param Node cNode 子节点
         * @return Node n 删除的子节点
         */
        remove : function(pSelector, cNode){
            var p = this.one(pSelector);
            
            if(null != p){
                return p.removeChild(cNode);
            }
            return null;
        },
        /**
         * 替换节点
         * @param Node newNode 新节点
         * @param Node|String oldNode 需要替换的节点/CSS选择器
         * @return Node 替找后的节点
         */
        replace : function(newNode, oldNode){
            var o = this.one(oldNode);
            var p = o.parentNode;
            if(null != p){
                return p.replaceChild(newNode, oldNode);
            }
            return null;
        },
        /**
         * 在指定节点前插入新的节点
         * @param Node newNode 新节点
         * @param Node|String refNode 参考节点/CSS选择器
         * @return Node 插入后的节点
         */
        insertBefore : function(newNode, refNode){
            var o = this.one(refNode);
            var p = o.parentNode;
            if(null != p){
                return p.insertBefore(newNode, refNode);
            }
            return null;
        },
        /**
         * 在指定节点前插入新的节点
         * @param Node newNode 新节点
         * @param Node|String refNode 参考节点/CSS选择器
         * @return Node 插入后的节点
         */
        insertAfter : function(newNode, refNode){
            var o = this.one(refNode);
            var p = o.parentNode;
            if(null != p){
                while(null != (o = o.nextSibling)){
                    if(o.nodeType && 1 == o.nodeType){
                        return this.insertBefore(newNode, o);
                    }
                }

                return this.append(newNode, p);
            }
            return null;
        },
        /**
         * 移除指定的class
         * @param Node|String node
         * @param String className
         */
        removeClass : function(node, className){
            this.replaceClass(node, className, "");
        },
        /**
         * 添加指定的class
         * @param Node|String node
         * @param String className
         */
        addClass : function(node, className){
            node = this.one(node);
            if(null != node && className && !this.hasClass(node, className)){
                node.className += " " + className;
            }
            node = null;
        },
        /**
         * 替换指定的class
         * @param Node|String node
         * @param String replaceClassName
         * @param String newClassName
         */
        replaceClass : function(node, replaceClassName, newClassName){
            node = this.one(node);
            if(null != node && this.hasClass(node, replaceClassName)){
                var cls = node.className;
                var tmp = "|" + cls.split(/\s+/).join("|") + "|";

                tmp = tmp.replace("|"+ replaceClassName +"|", (newClassName ? "|"+ newClassName +"|" : "|"));
                cls = tmp.split("|").join(" ");

                tmp = null;
                node.className = cls.replace(/^(\s*)|(\s*)$/g, "");
            }
            node = null;
        },
        /**
         * 是否存在class
         * @param Node|String node
         * @param String className
         */
        hasClass : function(node, className){
            node = this.one(node);
            if(null != node && className){
                var cls = node.className;
                var tmp = "|" + cls.split(/\s+/).join("|") + "|";

                return (tmp.indexOf("|"+ className +"|") != -1);
            }
            return false;
        },
        /**
         * 设置/获取指定的样式
         * @param Node|String selector 节点/CSS选择器
         * @param String name 属性名称
         * @param String value 属性值
         * @return String attr value参数为undefined或不传时返回
         */
        css : function(selector, name, value){
            var n = this.one(selector);
            
            if(null != n){
                if(undefined === value){
                    var s = "";
                    
                    if(window.getComputedStyle){
                        s = document.defaultView.getComputedStyle(n,null).getPropertyValue(name);
                    }else if(n.currentStyle){
                        s = n.currentStyle[name];
                    }else{
                        s = n.style[name];
                    }                    
                    return s;
                }else{
                    n.style[name] = value;
                }
            }
        },
        /**
         * 加载外部CSS
         * @param String href CSS地址
         */
        link : function(href){
            var h = this.one("head");
            var lnk = document.createElement("link");
            lnk.rel = "stylesheet";
            lnk.type = "text/css";
            lnk.href = href;            
            this.append(h,lnk);
            h = null; lnk = null;
        }
    };
    
    S.source("Node", __node);    
});